package cn.bugstack.sdk.registry.redis;

import cn.bugstack.sdk.domain.model.entity.ThreadPoolConfigEntity;
import cn.bugstack.sdk.domain.model.valobj.RegistryEnumVO;
import cn.bugstack.sdk.registry.IRegistry;
import org.redisson.api.RBucket;
import org.redisson.api.RList;
import org.redisson.api.RedissonClient;

import java.time.Duration;
import java.util.List;

/**
 * @author Fuzhengwei bugstack.cn @小傅哥
 * @description Redis 注册中心
 * @create 2024-05-12 16:22
 */
public class RedisRegistry implements IRegistry {

    private final RedissonClient redissonClient;

    public RedisRegistry(RedissonClient redissonClient) {
        this.redissonClient = redissonClient;
    }

    @Override
    public void reportThreadPool(List<ThreadPoolConfigEntity> threadPoolEntities) {
        RList<ThreadPoolConfigEntity> list = redissonClient.getList(RegistryEnumVO.THREAD_POOL_CONFIG_LIST_KEY.getKey());
        list.delete();
        list.addAll(threadPoolEntities);
    }

    @Override
    public void reportThreadPoolConfigParameter(ThreadPoolConfigEntity threadPoolConfigEntity) {
        String cacheKey = RegistryEnumVO.THREAD_POOL_CONFIG_PARAMETER_LIST_KEY.getKey() + "_" + threadPoolConfigEntity.getAppName() + "_" + threadPoolConfigEntity.getThreadPoolName();
        RBucket<ThreadPoolConfigEntity> bucket = redissonClient.getBucket(cacheKey);
        bucket.set(threadPoolConfigEntity, Duration.ofDays(30));
    }

    /**
     * 👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆
     *
     `redissonClient.getBucket(cacheKey)`获取的是Redisson中的**RBucket**数据类型，这是Redisson提供的一个通用对象存储结构。具体特点如下：

     1. **数据类型**：RBucket是Redisson中最基础的分布式对象类型，用于存储单个对象
     2. **存储内容**：可以存储任何实现了Serializable接口的Java对象
     3. **线程安全**：RBucket操作是线程安全的
     4. **序列化**：自动处理对象的序列化和反序列化
     5. **使用场景**：
     - 适合存储配置对象（如这里的ThreadPoolConfigEntity）
     - 适合存储单个复杂对象
     - 支持设置过期时间（如代码中的30天）

     在您看到的代码中，RBucket被用来存储线程池配置对象，实现了配置的分布式存储和动态更新功能。
     */

}
